package com.seezoon.application.tcp.executor.press;

import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.results.format.ResultFormatType;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import org.openjdk.jmh.runner.options.TimeValue;

public class JMHBenchmarkRunner {

    // ===== 1. 定义压测参数（可在main方法中动态修改）=====
    private static final int FORKS = 1;             // 独立的JVM进程数
    private static final int WARMUP_ITERATIONS = 2; // 预热迭代次数
    private static final int WARMUP_TIME = 1000; // 预热迭代时间
    private static final int MEASUREMENT_ITERATIONS = 10000; // 测量迭代次数
    private static final int MEASUREMENT_TIME = 1000; // 测量迭代时间
    private static final int THREADS = 4;            // 并发线程数
    private static final TimeUnit TIME_UNIT = TimeUnit.MILLISECONDS; // 时间单位


    public static void main(String[] args) throws RunnerException {
        // ===== 3. 配置JMH选项 =====
        Options opt = new OptionsBuilder()
                // 设置JVM fork选项
                .forks(FORKS)
                // 预热配置
                .warmupIterations(WARMUP_ITERATIONS)
                .warmupTime(TimeValue.milliseconds(WARMUP_TIME))
                // 测量配置
                .measurementIterations(MEASUREMENT_ITERATIONS)
                .measurementTime(TimeValue.milliseconds(MEASUREMENT_TIME))
                // 线程配置
                //.threads(THREADS)
                // 时间单位
                .timeUnit(TIME_UNIT)
                .mode(Mode.Throughput)
                .mode(Mode.AverageTime)
                // 输出格式：控制台文本格式
                .resultFormat(ResultFormatType.TEXT)
                // 结果输出文件（可选）
                //.result("benchmark-results.txt")
                // 详细模式（可选）
                .shouldDoGC(true)
                .build();

        // ===== 4. 执行基准测试 =====
        new Runner(opt).run();

    }

}
